package com.macro.mall.tiny.security.util;

import com.macro.mall.tiny.domain.AdminUserDetails;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;

public final class SecurityUtils { // 声明为 final 防止继承，私有构造函数防止实例化

    private SecurityUtils() {
        // 私有构造函数，防止实例化
    }

    /**
     * 获取当前用户的 Authentication 对象
     *
     * @return 当前用户的 Authentication 对象，如果未登录则返回 null
     */
    public static Authentication getCurrentUserAuthentication() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        // 通常还需要检查 authentication.isAuthenticated() 是否为 true
        // 但这里的判断简化处理，如果 authentication 为 null 或表示匿名用户，后续获取 Principal 会返回 null 或特定匿名主体
        // 更严谨可以在这里判断 authentication != null && authentication.isAuthenticated()
        return authentication;
    }

    /**
     * 获取当前登录用户的 Principal 对象
     *
     * @return 当前登录用户的 Principal 对象，可能是一个 UserDetails 实例，或者 String，取决于配置；如果未登录则返回 null
     */
    public static Object getCurrentUserPrincipal() {
        Authentication authentication = getCurrentUserAuthentication();
        if (authentication != null) {
            // 注意：authentication.getPrincipal() 可能返回 "anonymousUser" 字符串或其他表示匿名用户的主体
            // 如果需要严格判断是否已认证用户，可以在调用前检查 authentication.isAuthenticated()
            return authentication.getPrincipal();
        }
        return null; // 未登录
    }

    /**
     * 获取当前登录用户的用户名
     *
     * @return 当前登录用户的用户名，如果未登录或无法获取则返回 null
     */
    public static String getCurrentUsername() {
        Authentication authentication = getCurrentUserAuthentication();
        if (authentication != null && authentication.isAuthenticated()) { // 确保用户已认证
            Object principal = authentication.getPrincipal();
            if (principal instanceof UserDetails) {
                return ((UserDetails) principal).getUsername();
            } else if (principal instanceof String) {
                // 有些情况下 Principal 就是用户名字符串
                return (String) principal;
            }
        }
        return null; // 未登录或无法获取用户名
    }

    /**
     * 获取当前登录用户的 UserDetails 对象
     *
     * @return 当前登录用户的 UserDetails 对象，如果未登录或 Principal 不是 UserDetails 类型则返回 null
     */
    public static UserDetails getCurrentUserDetails() {
        Authentication authentication = getCurrentUserAuthentication();
        if (authentication != null && authentication.isAuthenticated()) { // 确保用户已认证
            Object principal = authentication.getPrincipal();
            if (principal instanceof AdminUserDetails) {
                return (AdminUserDetails) principal;
            }
        }
        return null; // 未登录或 Principal 不是 UserDetails
    }

    public static Long getCurrentUserId() {
        Authentication authentication = getCurrentUserAuthentication();
        if (authentication != null && authentication.isAuthenticated()) { // 确保用户已认证
            Object principal = authentication.getPrincipal();
            if (principal instanceof AdminUserDetails) {
                AdminUserDetails adminUserDetails = (AdminUserDetails) principal;
                return adminUserDetails.getUmsAdminId();
            }
        }
        return null; // 未登录或 Principal 不是 UserDetails
    }


    /**
     * 获取当前登录用户的自定义 UserDetails 对象
     *
     * @param <T>              自定义 UserDetails 的类型
     * @param userDetailsClass 自定义 UserDetails 的 Class 对象
     * @return 当前登录用户的自定义 UserDetails 对象，如果未登录或类型不匹配则返回 null
     */
    public static <T extends UserDetails> T getCurrentUserDetails(Class<T> userDetailsClass) {
        UserDetails currentUserDetails = getCurrentUserDetails();
        if (currentUserDetails != null && userDetailsClass.isInstance(currentUserDetails)) {
            return userDetailsClass.cast(currentUserDetails);
        }
        return null;
    }

    /**
     * 判断当前用户是否已认证 (非匿名)
     *
     * @return 如果用户已认证则返回 true，否则返回 false
     */
    public static boolean isAuthenticated() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        // Spring Security 默认情况下，如果用户已认证，isAuthenticated() 返回 true
        // 匿名用户通常也有 Authentication 对象，但 isAuthenticated() 返回 false
        return authentication != null && authentication.isAuthenticated();
    }
}